home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
LOGIC Apps
/
Logic-APPLE_II_APPS.iso
/
pc
/
LOGIC Apple II 5.25" Library - DOS Part 3
/
DOS078A.dsk
/
CATALOG ANALYSIS.bas
< prev
next >
Wrap
BASIC Source File
|
2012-02-16
|
6KB
|
144 lines
10 REM CATALOG ANALYSIS PROGRAM
20 REM VERSION 3 11/01/80
30 REM BRUCE W. CHRISTOPHER
400 GOSUB 13000: REM INITIALIZATION
500 GOSUB 7200: REM READ A DIRECTORY BLOCK
600 REM SCAN DIRECTORY ENTRIES
700 FOR I = 11 TO 221 STEP 35
800 A% = DBA% +I
900 IF PEEK(A%) = 255 OR PEEK(A%) = 0 THEN 1400: REM $FF OR $00 MEANS INACTIVE ENTRY.
1000 REM PICKUP FILE-TYPE AND FILE-NAME
1100 X$ = "": FOR J = 2 TO 32:X$ = X$ + CHR$( PEEK(A% +J)): NEXT J:DE$(E%) = X$
1200 DP%(E%,0) = PEEK(A%):DP%(E%,1) = PEEK(A% +1): REM GET POINTERS TO TRACK/SECTOR LIST
1300 E% = E% +1
1400 NEXT I
1500 TK% = PEEK(DBA% +1):SR% = PEEK(DBA% +2): REM GET POINTERS TO NEXT DIRECTORY BLOCK
1600 IF TK% OR SR% THEN 500
1700 REM NOW EXAMINE THE TRACK/SECTOR LISTS
1800 EL% = E% -1: FOR I = 0 TO EL%
1900 TK% = DP%(I,0):SR% = DP%(I,1)
2000 DP%(I,0) = 0: REM THIS VARIABLE WILL NOW BE USED AS A SECTOR COUNTER; INITIALIZE IT TO ZERO.
2100 GOSUB 7200: REM READ A LIST BLOCK
2200 DP%(I,0) = DP%(I,0) +1: REM COUNT ONE SECTOR FOR EACH TRACK/SECTOR-LIST BLOCK.
2300 FOR A = DBA% +12 TO DBA% +254 STEP 2
2400 IF PEEK(A) OR PEEK(A +1) THEN DP%(I,0) = DP%(I,0) +1
2500 NEXT A:TK% = PEEK(DBA% +1)
2600 SR% = PEEK(DBA% +2)
2700 IF TK% OR SR% THEN 2100
2800 NEXT I
2900 REM NOW SORT THE ARRAYS
2910 PRINT : PRINT "SORT IN PROGRESS"
3000 K% = EL% -1
3100 SW% = 0: FOR I = 0 TO K%
3200 IF MID$ (DE$(I),2) < = MID$ (DE$(I +1),2) THEN 3600
3300 X$ = DE$(I):DE$(I) = DE$(I +1):DE$(I +1) = X$
3400 X% = DP%(I,0):DP%(I,0) = DP%(I +1,0):DP%(I +1,0) = X%
3500 SW% = 1: REM INDICATE A SWITCH OCCURED
3600 NEXT I
3700 K% = K% -1: IF K% = 0 THEN 4000
3800 IF SW% < >0 THEN 3100
3900 REM NOW LIST THE RESULTS
4000 K% = 20:SUM% = 0
4100 FOR I = 0 TO EL%
4200 K% = K% +1: IF K% <21 THEN 4600
4300 TEXT : HOME : PRINT "TYPE SCT NAME"
4400 PRINT "---- --- ------------------------------"
4500 K% = 1
4600 X% = ASC( LEFT$(DE$(I),1))
4700 L$ = " ": IF X% > = 128 THEN X% = X% -128:L$ = "*"
4800 IF X% = 0 THEN T$ = "TXT": GOTO 5300
4900 IF X% = 1 THEN T$ = "INT": GOTO 5300
5000 IF X% = 2 THEN T$ = "APS": GOTO 5300
5100 IF X% = 4 THEN T$ = "BIN": GOTO 5300
5200 T$ = "UNK"
5300 X$ = RIGHT$(" " + STR$(DP%(I,0)),4)
5400 PRINT T$;L$;X$;" "; MID$ (DE$(I),2)
5500 SUM% = SUM% +DP%(I,0)
5600 IF K% = 20 THEN 5800
5700 NEXT I: GOTO 6000
5800 PRINT : PRINT "TYPE ANY CHARACTER TO CONTINUE";
5900 GET X$: GOTO 5700
6000 PRINT : PRINT "TYPE ANY CHARACTER TO CONTINUE";: GET X$
6100 PRINT : PRINT "--- SUMMARY ---"
6200 PRINT EL% +1;" DATASET(S) CATALOGED."
6300 PRINT 84 -EL% -1;" DIRECTORY ENTRIES FREE."
6400 PRINT SUM%;" SECTOR(S) IN USE."
6500 PRINT 403 -SUM%;" SECTOR(S) FREE."
6600 PRINT : INPUT "REPEAT LISTING (Y/N) ?";X$
6700 IF X$ = "Y" THEN 3900
6800 IF X$ < >"N" THEN 6600
6900 GOSUB 12700: REM RESET HIMEM
7000 END
7100 REM --- READ SUBROUTINE ---
7200 POKE CCA%,RD%: REM SET READ COMMAND
7300 POKE TA%,TK%: REM SET TRACK#
7400 POKE SA%,SR%: REM SET SECTOR#
7500 POKE ECA%,0: REM CLEAR ERROR BYTE
7600 CALL RWTS%: REM READ A SECTOR
7700 IF PEEK(ECA%) = 0 THEN RETURN
7800 FLASH : PRINT CHR$(7)
7900 PRINT "I/O ERROR #"; PEEK(ECA%)
8000 INVERSE : GOTO 6900
8100 REM *--------------------*
8200 REM * SUBROUTINE TO SETUP*
8300 REM *THE RWTS CONTROL- *
8400 REM *BLOCKS AND A MACHINE*
8500 REM *LANGUAGE ENTRY SEQ- *
8600 REM *UENCE *
8700 REM *--------------------*
8800 HM% = PEEK(116) *256 + PEEK(115)
8900 REM HM% SAVES INITIAL VALUE OF HIMEM
9000 SIZE% = 16 +17 +4 +256: REM SUBROUTINE TAKES 16 BYTES, IOB TAKES 17 BYTES, DCT TAKES 4 BYTES AND DATA BUFFER TAKES 256.
9100 HIMEM: HM% -SIZE%
9200 IF SLOT% <1 OR SLOT% >7 THEN GOSUB 12800: PRINT CHR$(7);"INVALID SLOT NUMBER": END
9300 RWTS% = HM% -(SIZE% -1): REM ENTRY ADDRESS FOR I/O SUBROUTINE
9400 IA% = RWTS% +16: REM IOB ADDRESS
9500 ECA% = IA% +13: REM ERROR CODE ADDRESS
9600 DCT% = IA% +17: REM DEVICE CHARACTERISTICS TABLE
9700 DBA% = DCT% +4: REM DATA BUFFER ADDRESS
9800 REM --- LOAD I/O SUBROUTINE ---
9900 POKE RWTS%,169: POKE RWTS% +1,IA%/256
10000 POKE RWTS% +2,160: POKE RWTS% +3,IA% - INT(IA%/256) *256
10100 POKE RWTS% +4,32: POKE RWTS% +5,217
10200 POKE RWTS% +6,3: POKE RWTS% +7,176
10300 POKE RWTS% +8,5: POKE RWTS% +9,169
10400 POKE RWTS% +10,0: POKE RWTS% +11,141
10500 POKE RWTS% +12,ECA% - INT(ECA%/256) *256: POKE RWTS% +13, INT(ECA%/256)
10600 POKE RWTS% +14,96: POKE RWTS% +15,0
10700 REM --- LOAD IOB ---
10800 POKE IA%,1: POKE IA% +1,SLOT% *16
10900 POKE IA% +2,DRIVE%: POKE IA% +3,0: REM ACCEPT ANY VOLUME
11000 TA% = IA% +4: REM ADDRESS OF IBTRK
11100 SA% = IA% +5: REM ADDRESS OF IBSECT
11200 POKE IA% +6,DCT% - INT(DCT%/256) *256
11300 POKE IA% +7,DCT%/256
11400 POKE IA% +8,DBA% - INT(DBA%/256) *256
11500 POKE IA% +9,DBA%/256
11600 POKE IA% +10,0: POKE IA% +11,0
11700 REM DEFINE DISK COMMAND CODES
11800 RD% = 1:WR% = 2
11900 CCA% = IA% +12: REM COMMAND CODE ADDRESS
12000 POKE CCA%,0: REM CLEAR COMMAND CODE
12100 POKE ECA%,0: POKE IA% +14,0
12200 POKE IA% +15, PEEK(IA% +1)
12300 POKE IA% +16, PEEK(IA% +2)
12400 REM --- LOAD DEVICE CHARACTERISTICS TABLE ---
12500 POKE DCT%,0: POKE DCT% +1,1: POKE DCT% +2,239: POKE DCT% +3,216
12600 RETURN
12700 REM USE THE FOLLOWING SUBROUTINE TO RESTORE HIMEM BEFORE ENDING YOUR PROGRAM.
12800 HIMEM: HM%: REM RESTORE ORIGINAL HIMEM
12900 RETURN
13000 REM --INITIALIZATION--
13100 SLOT% = 6:DRIVE% = 1
13200 REM CALL IO-SETUP SUBROUTINE BEFORE DEFINING ANY STRING VARIABLES.
13300 GOSUB 8100: REM INIT IO
13400 E% = 0:X$ = "":EM% = 83
13500 DIM DE$(EM%): REM DIRECTORY ENTRIES
13600 DIM DP%(EM%,1): REM POINTERS TO TRACK/SECTOR LISTS
13700 I = 0:K% = 0:X% = 0:SW% = 0
13800 TK% = 17:SR% = 12: REM INITIAL TRACK AND SECTOR
13900 REM IT IS ASSUMED THAT THE FIRST DIRECTORY BLOCK IS AT TRACK $11, SECTOR $0C
14000 TEXT : INVERSE
14100 PRINT : PRINT "DOS CATALOG ANALYSIS"
14200 PRINT : PRINT "HIT 'RETURN' WHEN DISKETTE TO BE": INPUT "ANALYZED IS READY.";X$
14300 RETURN